//go:build js || wasm

package godom

import "syscall/js"

// EventWrapper
// https://developer.mozilla.org/ru/docs/Web/API/Event
type EventWrapper interface {
	JSWrapper
	Bubbles() bool
	Cancelable() bool
	Composed() bool
	CurrentTarget() Element
	DefaultPrevented() bool
	EventPhase() string
	IsTrusted() bool
	Target() Element
	Type() string
	TimeStamp() int

	ComposedPath() []Element
	PreventDefault()
	StopImmediatePropagation()
	StopPropagation()
}

type Event struct {
	value js.Value
}

func (e *Event) Bubbles() bool {
	return e.value.Get("bubbles").Bool()
}

func (e *Event) Cancelable() bool {
	return e.value.Get("cancelable").Bool()
}

func (e *Event) Composed() bool {
	return e.value.Get("composed").Bool()
}

func (e *Event) CurrentTarget() Element {
	//todo: сделать когда будет реализован Element
	return Element{}
}

func (e *Event) DefaultPrevented() bool {
	return e.value.Get("defaultPrevented").Bool()
}

func (e *Event) EventPhase() string {
	return e.value.Get("eventPhase").String()
}

func (e *Event) IsTrusted() bool {
	return e.value.Get("isTrusted").Bool()
}

func (e *Event) Target() Element {
	//todo: сделать когда будет реализован Element
	return Element{}
}

func (e *Event) Type() string {
	return e.value.Get("type").String()
}

func (e *Event) TimeStamp() int {
	return e.value.Get("timeStamp").Int()
}

func (e *Event) ComposedPath() []Element {
	//todo: сделать когда будет реализован Element
	return nil
}

func (e *Event) PreventDefault() {
	e.value.Call("preventDefault")
}

func (e *Event) StopImmediatePropagation() {
	e.value.Call("stopImmediatePropagation")
}

func (e *Event) StopPropagation() {
	e.value.Call("stopPropagation")
}

func (e *Event) JSValue() js.Value {
	return e.value
}
